import axios from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'
import router from '@/router'

// 环境配置
const config = {
  development: {
    baseURL: 'https://localhost:5001/api',
    timeout: 10000
  },
  production: {
    baseURL: 'https://api.jqdata.com/api', // 生产环境API地址（可被环境变量覆盖）
    timeout: 10000
  }
}

// 获取当前环境配置（支持 .env 覆盖）
const getConfig = () => {
  const env = import.meta.env.MODE || 'development'
  const envBaseURL = import.meta.env.VITE_API_BASE_URL
  const envTimeout = Number(import.meta.env.VITE_API_TIMEOUT)
  return {
    baseURL: envBaseURL || (config[env]?.baseURL || config.development.baseURL),
    timeout: Number.isFinite(envTimeout) && envTimeout > 0 ? envTimeout : (config[env]?.timeout || 10000)
  }
}

// 将后端返回的 errors 结构（string | string[] | Record<string, string[]>）转成可读文案
function normalizeErrors(errors) {
  if (!errors) return ''
  if (typeof errors === 'string') return errors
  if (Array.isArray(errors)) return errors.filter(Boolean).join('; ')
  if (typeof errors === 'object') {
    const parts = []
    for (const key of Object.keys(errors)) {
      const val = errors[key]
      if (Array.isArray(val)) parts.push(val.filter(Boolean).join('; '))
      else if (typeof val === 'string') parts.push(val)
      else if (val && typeof val === 'object') parts.push(JSON.stringify(val))
    }
    return parts.filter(Boolean).join('; ')
  }
  try { return String(errors) } catch { return '请求失败' }
}

// 创建 axios 实例
const api = axios.create({
  ...getConfig(),
  headers: {
    'Content-Type': 'application/json',
    'request-from': 'webapp'
  }
})

// 请求拦截器
api.interceptors.request.use(
  (config) => {
    // 可以在这里添加token等认证信息
    // const token = localStorage.getItem('token')
    // if (token) {
    //   config.headers.Authorization = `Bearer ${token}`
    // }
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

// 响应拦截器
api.interceptors.response.use(
  (response) => {
    const { data } = response
    
    // 检查业务状态码（兼容 statusCode 为 0 或 200 的成功，同时优先以 succeeded 为准）
    const isSuccess = (data && data.succeeded === true) || data?.statusCode === 200 || data?.statusCode === 0
    if (isSuccess) {
      // 成功响应
      return data
    } else if (data?.statusCode === 401) {
      // 未授权，跳转到登录页
      ElMessage.error('登录已过期，请重新登录')
      // 清除本地存储的认证信息
      localStorage.removeItem('token')
      localStorage.removeItem('userInfo')
      // 跳转到登录页面（如果有的话）
      router.push('/login').catch(() => {
        // 如果没有登录页面，显示提示
        ElMessageBox.alert('请联系管理员配置登录页面', '提示', {
          confirmButtonText: '确定'
        })
      })
      return Promise.reject(new Error('未授权'))
    } else if (data?.statusCode === 400) {
      // 客户端错误
      const errorMsg = normalizeErrors(data.errors) || '请求参数有误'
      ElMessage.error(errorMsg)
      return Promise.reject(new Error(errorMsg))
    } else if (data?.statusCode === 500) {
      // 服务器错误
      const errorMsg = normalizeErrors(data.errors) || '服务器内部错误'
      ElMessage.error(errorMsg)
      return Promise.reject(new Error(errorMsg))
    } else {
      // 其他业务错误
      const errorMsg = normalizeErrors(data?.errors) || data?.message || '请求失败'
      ElMessage.error(errorMsg)
      return Promise.reject(new Error(errorMsg))
    }
  },
  (error) => {
    // HTTP错误处理
    let errorMessage = '网络异常'
    
    if (error.response) {
      // 服务器返回了错误状态码
      const { status, data } = error.response
      switch (status) {
        case 400:
          errorMessage = '请求参数错误'
          break
        case 401:
          errorMessage = '未授权访问'
          // 处理401错误
          localStorage.removeItem('token')
          localStorage.removeItem('userInfo')
          router.push('/login').catch(() => {
            ElMessageBox.alert('请联系管理员配置登录页面', '提示', {
              confirmButtonText: '确定'
            })
          })
          break
        case 403:
          errorMessage = '禁止访问'
          break
        case 404:
          errorMessage = '请求资源不存在'
          break
        case 500:
          errorMessage = '服务器内部错误'
          break
        case 502:
          errorMessage = '网关错误'
          break
        case 503:
          errorMessage = '服务不可用'
          break
        case 504:
          errorMessage = '网关超时'
          break
        default:
          errorMessage = data?.message || `请求失败 (${status})`
      }
      // 优先展示后端携带的 errors 详情
      const detailed = normalizeErrors(data?.errors)
      if (detailed) errorMessage = detailed
      else if (data?.message) errorMessage = data.message
    } else if (error.request) {
      // 请求发送了但没有收到响应
      errorMessage = '网络连接超时'
    } else {
      // 其他错误
      errorMessage = error.message || '请求配置错误'
    }
    
    ElMessage.error(errorMessage)
    return Promise.reject(error)
  }
)

// API 方法封装
export const hotMoneyAPI = {
  // 新：按ID获取详情数据（与路由 /hot-money-detail/:id 对应）
  getHotMoneyData(id) {
    // 如果后端期望的是路径参数，则维持如下形式；如需 body，请调整
    return api.get(`/hot-money-api/gethotmoneydata/${id}`)
  },
  
  // 获取游资持仓数据
  getHotMoneyStock(hotMoneyId) {
    return api.post(`/hot-money-api/hot-money-stock-table/${hotMoneyId}`, '')
  },

  // 新增：获取热门游资列表（分页）
  getHotMoneyList(pageIndex) {
    return api.get(`/hot-money-api/gethotmoneylist/${pageIndex}`)
  }
}

// 新增：股票列表（游资雷达-股票）接口封装
export const hotMoneyStockAPI = {
  // 获取列表（POST）
  getList(payload) {
    return api.post('/hot-money-stock-api/list', payload)
  }
}

// 默认导出
export default api